#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define str string
#define all(x) (x).begin(),(x).end()
#define ms(a,t) memset(a,t,sizeof(a))
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MP make_pair
#define pb push_back
#define fi first
#define se second
#define db double
#define lowbit(x) ((x)&(-(x)))
const int maxn = 5e6+10;
const int mod = 998244353;
const ll INF = 0x3f3f3f3f;
const db eps = 1e-7;
ll n,m,q,k;
ll fp(ll x,ll y) {
	ll ret = 1;
	while(y > 0) {
		if(y & 1) ret = ret * x % mod;
		x = x * x % mod;
		y >>= 1;
	}
	return ret;
}
ll inv[maxn],fac[maxn];
void init(const int T = 1e6) {
	fac[0] = 1; for(int i = 1; i <= T; i++) fac[i] = fac[i-1] * i % mod;
	inv[T] = fp(fac[T],mod-2); 
	for(int i = T-1; i >= 0; i--) inv[i] = inv[i+1] * (i+1) % mod; 
}
ll C(ll x,ll y) {
	if(x < y || y < 0 || x < 0)  return 0;
	return fac[x] * inv[y] % mod * inv[x-y] % mod;
}
ll A(ll x,ll y) {
	if(x < y || x < 0) return 0;
	return fac[x] * inv[x-y] % mod;
}
int b[maxn];
void Solve() {
	cin >> n >> m >> q >> k; init(m);
	if(n < m || q < m) {
		cout<<0<<'\n';
		return;
	}
	for(int i = 1; i <= m; i++) {
		cin >> b[i];
	}
	ll w = n * k % mod;
	ll s = 0;
	for(int i = 0; i <= m; i++) {
		ll tmp = 0;
		tmp = C(m,i)*fp((n-i),q) % mod;
		if(i&1) {
			s = (s - tmp + mod) % mod;
		} else {
			s = (s + tmp) % mod;
		}
	}
//	cerr<<s<<'\n';
	cout<<s * (n-m+1) % mod * fp(k,q-m) % mod<<'\n';
}
int main() {
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	int TT; cin >> TT; while(TT--)
	Solve();
	return 0;
}
